맨위로가기

동적 링크 라이브러리

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

동적 링크 라이브러리(DLL)는 윈도우 운영 체제에서 프로그램의 기능을 모듈화하여 재사용하고 관리하는 데 사용되는 기술이다. DLL은 여러 프로그램이 공유하는 코드를 별도의 파일로 저장하여 메모리 사용량을 줄이고, 모듈성을 통해 애플리케이션의 유지보수와 확장을 용이하게 한다. DLL은 파일 형식과 확장자를 가지며, 런타임 시에 로드되어 프로그램과 연결될 수 있다. DLL의 주요 장점은 애플리케이션 수정의 용이성이지만, DLL 지옥, 공유 메모리 공간으로 인한 문제, DLL 하이재킹과 같은 보안 취약점과 같은 단점도 존재한다. COM(Component Object Model)은 DLL에서 객체 구현을 호스팅하기 위한 바이너리 표준을 정의하며, 다양한 프로그래밍 언어에서 DLL을 활용할 수 있다.

더 읽어볼만한 페이지

  • 라이브러리 - 바이너리 재컴파일러
  • 라이브러리 - 링커 (컴퓨팅)
    링커는 여러 모듈로 된 목적 파일을 결합해 실행 가능한 프로그램을 만들고, 정적/동적 링킹으로 라이브러리를 연결하며, 심볼 해결 및 재배치로 변수와 함수를 메모리 주소에 연결하는 소프트웨어 도구이다.
  • 파일 포맷 - 바로 가기
    바로 가기는 운영체제에서 파일, 폴더, 프로그램, 웹 페이지에 대한 참조를 제공하는 기능 및 파일로, 사용자들이 원본에 빠르게 접근하도록 GUI 환경의 사용성을 향상시킨다.
  • 파일 포맷 - EXE
    EXE 파일 형식은 운영 체제에 따라 다양한 종류가 있는 실행 파일의 한 형태로, DOS MZ 실행 파일에서 PE, PE32+까지 발전해 왔으며, 코드, 데이터, 스택을 별도 관리하고 재배치 항목을 통해 실행 환경에 유연하게 대응하는 특징을 가진다.
동적 링크 라이브러리 - [IT 관련 정보]에 관한 문서
파일 정보
DLL 아이콘
DLL 아이콘
개요
파일 확장자.dll
MIME 형식application/vnd.microsoft.portable-executable
유니폼 타입com.microsoft.windows-dynamic-link-library
매직 넘버MZ
소유자마이크로소프트
컨테이너 형식공유 라이브러리
기술 정보
설명마이크로소프트의 윈도우 및 OS/2 운영체제에서 사용되는 공유 라이브러리 구현 방식
관련 기술동적 링커
관련 용어동적 로드 라이브러리
참고
주의사항`` 형태의 템플릿 구문은 출력에 포함하지 않음

2. 역사적 배경

초창기 마이크로소프트 윈도우는 프로그램을 단일 주소 공간에서 함께 실행했다. 모든 프로그램은 그래픽 사용자 인터페이스(GUI)가 멀티태스킹을 수행하고 최대한 응답성을 높일 수 있도록 다른 프로그램에 CPU를 양보함으로써 협력하도록 설계되었다.[27] 모든 운영 체제 수준의 작업은 기본 운영 체제인 MS-DOS에서 제공되었다. 모든 상위 수준 서비스는 윈도우 라이브러리 "동적 연결 라이브러리"에서 제공되었다. 드로잉 API인 그래픽 장치 인터페이스(GDI)는 `GDI.EXE`라는 DLL에, 사용자 인터페이스는 `USER.EXE`에 구현되었다. DOS 위에 이러한 추가 계층은 모든 실행 중인 윈도우 프로그램에서 공유되어야 했다. 이는 윈도우가 1MB 미만의 RAM을 가진 컴퓨터에서 작동할 수 있도록 하기 위해서 뿐만 아니라, 프로그램이 서로 협력할 수 있도록 하기 위함이었다. GDI의 코드는 드로잉 명령을 특정 장치에 대한 작업으로 변환해야 했다. 디스플레이에서는 프레임 버퍼의 픽셀을 조작해야 했다. 프린터로 그릴 때는 API 호출을 프린터 요청으로 변환해야 했다. 제한된 장치 집합(예: 컬러 그래픽스 어댑터 디스플레이, HP 레이저젯 프린터 제어 언어)에 대한 하드 코딩된 지원을 제공하는 것이 가능했지만, 마이크로소프트는 다른 접근 방식을 선택했다. GDI는 "장치 드라이버"라고 하는 여러 코드 조각을 로드하여 다양한 출력 장치와 함께 작동했다.

GDI가 다양한 장치 드라이버를 로드할 수 있도록 하는 동일한 아키텍처 개념은 윈도우 셸이 다양한 윈도우 프로그램을 로드하고 이러한 프로그램이 공유 USER 및 GDI 라이브러리에서 API 호출을 호출할 수 있도록 했다. 그 개념이 바로 "동적 연결"이었다.

기존의 비 공유 정적 라이브러리에서 코드 섹션은 "연결" 단계에서 실행 파일이 빌드될 때 호출 프로그램에 단순히 추가된다. 두 프로그램이 동일한 루틴을 호출하면, 그 루틴은 두 프로그램의 연결 단계에서 모두 포함된다. 동적 연결을 사용하면 공유 코드가 단일의 별도 파일에 배치된다. 이 파일을 호출하는 프로그램은 런타임에 연결되며, 운영 체제(또는 초기 버전의 윈도우의 경우 OS 확장)가 바인딩을 수행한다.

초창기 버전의 윈도우(1.0 ~ 3.11)에서 DLL은 전체 GUI의 기반이었다. 따라서 디스플레이 드라이버는 통합된 장치 드라이버 인터페이스(DDI)를 통해 동일한 드로잉 API의 사용자 지정 구현을 제공하는 .DRV 확장자를 가진 DLL에 불과했으며, 드로잉(GDI) 및 GUI(USER) API는 .EXE 확장자를 가진 GDI 및 USER 시스템 DLL에서 내보낸 함수 호출에 불과했다.

동적으로 로드된 라이브러리 모음에서 운영 체제를 구성하는 이러한 개념은 윈도우의 핵심 개념이다. DLL은 공유 라이브러리의 표준 이점, 예를 들어 모듈성을 제공한다. 모듈성을 통해 여러 애플리케이션에서 공유되는 단일 독립형 DLL의 코드 및 데이터를 변경하여 애플리케이션 자체를 변경하지 않고도 변경할 수 있다.

모듈성의 또 다른 이점은 플러그인에 대한 일반 인터페이스의 사용이다. 단일 인터페이스를 개발하여 이전 모듈뿐만 아니라 새로운 모듈도 애플리케이션 자체를 수정하지 않고 런타임에 기존 애플리케이션에 원활하게 통합할 수 있다. 이러한 동적 확장성 개념은 Component Object Model인 ActiveX의 기반에서 극대화되었다.

윈도우 1.x, 2.x 및 3.x에서 모든 윈도우 애플리케이션은 동일한 주소 공간과 동일한 메모리를 공유했다. DLL은 이 주소 공간에 한 번만 로드되었으며, 그 이후에는 라이브러리를 사용하는 모든 프로그램이 액세스했다. 라이브러리의 데이터는 모든 프로그램에서 공유되었다. 이는 프로세스 간 통신의 간접적인 형태로 사용될 수 있거나, 의도치 않게 다른 프로그램을 손상시킬 수 있었다. 32비트 라이브러리가 윈도우 95에 도입되면서 모든 프로세스가 자체 주소 공간에서 실행되었다. DLL 코드는 공유될 수 있지만, 데이터는 라이브러리에서 공유 데이터를 명시적으로 요청하는 경우를 제외하고는 비공개이다. 즉, 윈도우 95, 윈도우 98 및 윈도우 Me의 상당 부분이 16비트 라이브러리로 구축되었으며, 이로 인해 펜티엄 프로 마이크로프로세서가 출시되었을 때 성능이 제한되었고, 궁극적으로 DOS 기반 윈도우 버전의 안정성과 확장성이 제한되었다.

3. 파일 형식 및 확장자

DLL 파일은 보통 파일 확장자.dll을 갖지만, 다른 파일 확장자를 가질 수도 있다. 개발자는 ActiveX 컨트롤의 .ocx와 레거시(16비트) 장치 드라이버의 .drv와 같이 파일의 내용을 설명하는 파일 확장자를 선택할 수 있다.

자원만 포함하는 DLL은 '자원 DLL'이라고 할 수 있다. 예를 들어 확장자 .icl을 가지는 아이콘 라이브러리와, .fon 및 .fot 확장자를 가지는 글꼴 라이브러리가 있다.[1]

DLL의 파일 형식실행 파일(EXE)과 동일하지만, 윈도우의 버전별로 다른 형식을 사용한다. 32비트64비트 윈도우 버전은 PE (Portable Executable)를 사용하고, 16비트 윈도우 버전은 NE (New Executable)를 사용한다.

DLL과 EXE의 주요 차이점은 운영 체제가 실행을 시작하기 위한 진입점을 필요로 하기 때문에 DLL은 직접 실행할 수 없다는 것이다.

4. 특징

DLL은 모듈성과 같은 공유 라이브러리의 표준 이점을 제공한다. 모듈성을 통해 여러 애플리케이션에서 공유되는 DLL의 코드 및 데이터를 변경하여 애플리케이션 자체를 변경하지 않고도 기능을 변경하거나 확장할 수 있다.

또한 플러그인에 대한 일반 인터페이스를 사용하여 이전 모듈뿐만 아니라 새로운 모듈도 애플리케이션 자체를 수정하지 않고 런타임에 기존 애플리케이션에 통합할 수 있다. 이러한 동적 확장성 개념은 ActiveX에서 극대화되었다.

DLL 기술을 사용하면 구성 요소를 다시 컴파일하거나 다시 링크할 필요 없이 애플리케이션을 수정할 수 있다. DLL을 교체하면 다음에 애플리케이션이 실행될 때 새 DLL 버전을 사용하는데, 이때 DLL 변경 사항이 하위 호환성을 유지해야 한다.

윈도우 API에서 DLL 파일은 쓰기 가능 또는 읽기 전용, 실행 가능(코드용) 또는 실행 불가능(데이터용) 등과 같은 자체 속성을 가지는 ''섹션''으로 구성된다.

DLL의 코드는 일반적으로 DLL을 사용하는 모든 프로세스 간에 공유된다. 즉, 물리적 메모리의 단일 위치를 차지하며 페이지 파일에서 공간을 차지하지 않는다. 코드 섹션이 차지하는 물리적 메모리를 회수하려면 해당 내용을 폐기하고 필요한 경우 DLL 파일에서 직접 다시 로드한다.

코드 섹션과 달리 DLL의 데이터 섹션은 일반적으로 개인적이다. 즉, DLL을 사용하는 각 프로세스는 DLL의 모든 데이터에 대한 자체 복사본을 갖는다. 선택적으로 데이터 섹션을 공유하도록 설정하여 프로세스 간 통신을 허용할 수 있지만, 이는 보안 구멍을 만든다. 하나의 프로세스가 공유 데이터를 손상시킬 수 있으며, 이는 다른 모든 공유 프로세스가 바람직하지 않게 작동하게 할 수 있기 때문이다. 따라서 DLL에서 공유 섹션 사용을 피해야 한다.

정적 라이브러리와 마찬가지로, DLL의 임포트 라이브러리는 `.lib` 파일 확장자로 표시된다. 예를 들어, 파일 생성 및 메모리 관리와 같은 Windows 기본 기능에 대한 주요 동적 라이브러리인 kernel32.dll은 `kernel32.lib`를 통해 링크된다.[3]

4. 1. 심볼 해석 및 바인딩

DLL(동적 링크 라이브러리)에서 내보낸 각 함수는 숫자 서수와 선택적으로 이름으로 식별된다. 마찬가지로, 함수는 서수 또는 이름으로 DLL에서 가져올 수 있다. 서수는 DLL 내보내기 주소 테이블에서 함수의 주소 포인터 위치를 나타낸다. 내부 함수를 서수로만 내보내는 것이 일반적이다. 대부분의 Windows API 함수의 경우 서로 다른 Windows 릴리스에서 이름만 유지되며, 서수는 변경될 수 있다. 따라서 서수를 사용하여 Windows API 함수를 안정적으로 가져올 수 없다.[27]

서수로 함수를 가져오는 것은 이름으로 가져오는 것보다 약간 더 나은 성능을 제공한다. DLL의 내보내기 테이블은 이름별로 정렬되므로 이진 검색을 사용하여 함수를 찾을 수 있다. 찾은 이름의 색인은 내보내기 서수 테이블에서 서수를 조회하는 데 사용된다. 16비트 Windows에서는 이름 테이블이 정렬되지 않았으므로 이름 조회 오버헤드가 훨씬 더 눈에 띄었다.

실행 파일을 특정 버전의 DLL에 ''바인딩''하는 것도 가능하다. 즉, 컴파일 시 가져온 함수의 주소를 확인하는 것이다. 바인딩된 가져오기의 경우, 링커는 가져오기가 바인딩된 DLL의 타임스탬프와 체크섬을 저장한다. 런타임에 Windows는 동일한 버전의 라이브러리가 사용되고 있는지 확인하고, 그렇다면 Windows는 가져오기 처리를 우회한다. 그렇지 않으면 라이브러리가 바인딩된 라이브러리와 다른 경우 Windows는 일반적인 방식으로 가져오기를 처리한다.

바인딩된 실행 파일은 컴파일된 것과 동일한 환경에서 실행되는 경우 다소 빠르게 로드되며, 다른 환경에서 실행되는 경우 정확히 동일한 시간이 소요되므로 가져오기를 바인딩하는 데 단점이 없다. 예를 들어, 모든 표준 Windows 응용 프로그램은 해당 Windows 릴리스의 시스템 DLL에 바인딩되어 있다. 응용 프로그램의 가져오기를 해당 대상 환경에 바인딩하는 좋은 기회는 응용 프로그램의 설치 중에 있다. 이렇게 하면 다음 OS 업데이트까지 라이브러리가 "바인딩"된 상태로 유지된다. 그러나 실행 파일의 체크섬이 변경되므로 서명된 프로그램이나 파일 버전을 관리하기 위해 체크섬(예: MD5 체크섬)을 사용하는 구성 관리 도구로 관리되는 프로그램에서는 이 작업을 수행할 수 없다. 최근 Windows 버전에서 보안상의 이유로 로드된 모든 라이브러리에 고정된 주소를 사용하는 방식을 벗어나면서 실행 파일을 바인딩하는 기회와 가치가 감소하고 있다.

4. 2. 명시적 런타임 링크

`LoadLibrary`, `GetProcAddress`, `FreeLibrary` API 함수를 사용하여 런타임에 DLL을 명시적으로 로드하고, 함수 주소를 획득하며, 언로드할 수 있다.[27] 이는 함수 포인터를 지원하는 모든 언어에서 사용할 수 있다.

C, 델파이, 마이크로소프트 비주얼 베이직을 사용하여 런타임 로딩/링크 체계를 사용하는 방법은 다음과 같다.

언어코드 예제
C
델파이
마이크로소프트 비주얼 베이직



이러한 함수들은 POSIX 표준 API의 `dlopen`, `dlsym` 및 `dlclose`와 유사하다. 명시적 런타임 연결 절차는 함수 포인터를 지원하는 모든 언어에서 동일하며, 언어 구조보다는 Windows API에 의존한다.

4. 3. 지연 로딩

일반적으로 DLL의 임포트 라이브러리에 링크된 응용 프로그램은 DLL을 찾을 수 없는 경우 시작에 실패한다. Windows는 응용 프로그램에 필요한 모든 DLL을 찾을 수 없는 경우 응용 프로그램을 실행하지 않기 때문이다.[6] 그러나 응용 프로그램은 동적 라이브러리의 지연 로딩을 허용하기 위해 임포트 라이브러리에 링크될 수 있다.[6]

이 경우 운영 체제는 응용 프로그램이 시작될 때 DLL을 찾거나 로드하려고 시도하지 않는다. 대신, 링커는 응용 프로그램에 스텁을 포함시켜 해당 기능 중 하나가 호출될 때 `LoadLibrary` 및 `GetProcAddress`를 통해 DLL을 찾고 로드하려고 시도한다. DLL을 찾거나 로드할 수 없거나 호출된 기능이 존재하지 않는 경우 응용 프로그램은 예외를 생성하며, 이를 적절하게 포착하고 처리할 수 있다. 응용 프로그램이 예외를 처리하지 않으면 운영 체제에서 포착하여 오류 메시지와 함께 프로그램을 종료한다.

지연 로딩 메커니즘은 또한 훅을 제공하여 응용 프로그램이 DLL이 로드되거나 DLL 함수가 호출될 때 추가적인 처리 또는 오류 처리를 수행할 수 있도록 한다.

5. 프로그래밍 예제

다음은 런타임에 동적 링크 라이브러리(DLL)를 로드하고 사용하는 예제이다.

; 델파이

```delphi

program Example;

{$APPTYPE CONSOLE}

uses

Windows;

type

AddNumbersProc = function (a, b: Double): Double; cdecl;

var

result: Double;

hInstLib: HMODULE;

AddNumbers: AddNumbersProc;

begin

hInstLib := LoadLibrary('example.dll');

if hInstLib <> 0 then

begin

AddNumbers := GetProcAddress(hInstLib, 'AddNumbers');

if Assigned(AddNumbers) then

begin

result := AddNumbers(1, 2);

Writeln('결과는: ', result);

end

else

begin

Writeln('오류: DLL 함수를 찾을 수 없습니다');

ExitCode := 1;

end;

FreeLibrary(hInstLib);

end

else

begin

Writeln('오류: 라이브러리를 불러올 수 없습니다');

ExitCode := 1;

end;

ExitCode := 0;

end.

```

; C/C++

```c

#include

#include

// DLL 함수 서명

typedef double (*importFunction)(double, double);

int main(int argc, char **argv)

{

importFunction addNumbers;

double result;

// DLL 파일 불러오기

HINSTANCE hinstLib = LoadLibrary("Example.dll");

if (hinstLib == NULL) {

printf("오류: DLL을 불러올 수 없습니다\n");

return 1;

}

// 함수 포인터 얻기

addNumbers = (importFunction)GetProcAddress(hinstLib, "AddNumbers");

if (addNumbers == NULL) {

printf("오류: DLL 함수를 찾을 수 없습니다\n");

FreeLibrary(hinstLib);

return 1;

}

// 함수 요청하기.

result = addNumbers(1, 2);

// DLL 파일의 로드를 해제한다

FreeLibrary(hinstLib);

// 결과를 보여 준다

printf("결과는: %f\n", result);

return 0;

}

```

; Python

```python

import ctypes

my_dll = ctypes.cdll.LoadLibrary("Example.dll")

# 다음 "restype" 메서드 지정은 Python이 함수에서 반환되는 유형을 이해하도록 하기 위해 필요합니다.

my_dll.AddNumbers.restype = ctypes.c_double

p = my_dll.AddNumbers(ctypes.c_double(1.0), ctypes.c_double(2.0))

print("결과는:", p)

6. 한계점 및 문제점

DLL 기술은 윈도우 아키텍처의 핵심 기술이지만, 몇 가지 단점과 문제점을 가지고 있다.

DLL은 호출 프로세스의 메모리 공간에서 같은 접근 권한으로 실행되므로 오버헤드가 적지만, DLL에 버그가 있을 경우 호출 프로그램에 대한 보호 기능이 없다. 즉, DLL의 문제는 호출한 프로그램의 문제로 이어질 수 있다.

DLL의 코드는 일반적으로 DLL을 사용하는 모든 프로세스 간에 공유된다. 윈도우는 DLL에 위치 독립 코드를 사용하지 않고, 로드될 때 재배치를 통해 DLL을 로드하는 첫 번째 프로세스의 메모리 공간에서 사용 가능한 위치에 있는 모든 진입점에 대한 주소를 수정한다. 각 프로그램에 대해 별도의 주소 공간을 사용하는 최신 버전의 윈도우에서는 각 프로그램이 DLL 코드를 수용할 수 있는 동일한 가상 주소를 가지고 있는 경우에만 DLL의 재배치된 동일한 복사본을 여러 프로그램에서 사용할 수 있다. 만약 일부 프로그램이 해당 주소를 가지고 있지 않다면, DLL 코드의 추가적인 물리적 복사본을 생성해야 한다.

DLL의 데이터 섹션은 보통 개별적이다. 즉, DLL을 사용하는 각 프로세스는 DLL의 모든 데이터에 대한 자체 복사본을 가진다. 선택적으로 데이터 섹션을 공유하도록 설정할 수 있지만, 이는 보안 취약점을 만들 수 있다. 한 프로세스가 공유 데이터를 손상시키면 다른 모든 공유 프로세스가 오작동할 수 있기 때문이다.

DLL이 UPX와 같은 특정 실행 파일 패커로 압축된 경우, 모든 코드 섹션은 읽기 및 쓰기로 표시되며 공유되지 않는다. 따라서 공유 데이터 섹션을 가진 DLL은 여러 프로그램에서 동시에 사용하려는 경우 압축하면 안 된다.

DLL 하이재킹(DLL Hijacking)은 취약점의 일종으로, 많은 프로그램들이 해당 프로그램이 열었던 데이터 파일과 같은 폴더에 포함된 악성 DLL을 로드하여 실행하게 하는 것이다.[13][14][15][16] 사용자가 쓸 수 있는 폴더에서 실행되는 프로그램은 거의 항상 이 취약점에 취약하다.[19][20][21][22][23][24][25]

6. 1. DLL 지옥 (DLL Hell)

DLL 지옥은 잘못된 버전의 DLL이 사용될 때 응용 프로그램이 오작동하는 현상을 설명한다.[2] 이를 해결하기 위한 방법은 다음과 같다.

  • .NET Framework
  • Microsoft Virtual PC, Microsoft Application Virtualization과 같은 가상화 기반 솔루션은 응용 프로그램 간의 격리를 제공한다.
  • Side-by-side 어셈블리

6. 2. 공유 메모리 공간

DLL의 실행 코드는 호출 프로세스의 메모리 공간에서 같은 접근 권한으로 실행되므로 사용 시 오버헤드가 거의 없지만, DLL에 버그가 있는 경우 호출 프로그램에 대한 보호 기능이 없다는 의미이기도 하다.

윈도우 API에서 DLL 파일은 ''섹션''으로 구성된다. 각 섹션에는 쓰기 가능 또는 읽기 전용, 실행 가능(코드용) 또는 실행 불가능(데이터용) 등과 같은 자체 속성이 있다.

DLL의 코드는 보통 DLL을 사용하는 모든 프로세스 간에 공유된다. 즉, 물리적 메모리의 단일 위치를 차지하며 페이지 파일에서 공간을 차지하지 않는다. 윈도우는 DLL에 위치 독립 코드를 사용하지 않는다. 대신 코드는 로드될 때 재배치를 거쳐 DLL을 로드하는 첫 번째 프로세스의 메모리 공간에서 사용 가능한 위치에 있는 모든 진입점에 대한 주소를 수정한다. 모든 실행 프로세스가 단일 공통 주소 공간을 차지하는 이전 버전의 윈도우에서는 DLL 코드의 단일 복사본만으로 모든 프로세스에 항상 충분했다. 그러나 각 프로그램에 대해 별도의 주소 공간을 사용하는 최신 버전의 윈도우에서는 각 프로그램이 DLL 코드를 수용할 수 있는 동일한 가상 주소를 가지고 있는 경우에만 DLL의 재배치된 동일한 복사본을 여러 프로그램에서 사용할 수 있다. 일부 프로그램(또는 이미 로드된 DLL의 조합)에 해당 주소가 없는 경우 다른 재배치된 진입점 집합을 사용하여 DLL 코드의 추가 물리적 복사본을 생성해야 한다. 코드 섹션이 차지하는 물리적 메모리를 회수하려면 해당 내용을 폐기하고 필요한 경우 DLL 파일에서 직접 다시 로드한다.

코드 섹션과 달리 DLL의 데이터 섹션은 보통 개인적이다. 즉, DLL을 사용하는 각 프로세스는 DLL의 모든 데이터에 대한 자체 복사본을 갖는다. 선택적으로 데이터 섹션을 공유하도록 설정하여 이 공유 메모리 영역을 통해 프로세스 간 통신을 허용할 수 있다. 그러나 사용자 제한이 공유 DLL 메모리 사용에 적용되지 않으므로 이는 보안 구멍을 만든다. 즉, 하나의 프로세스가 공유 데이터를 손상시킬 수 있으며, 이는 다른 모든 공유 프로세스가 바람직하지 않게 작동하게 할 수 있다. 예를 들어, 게스트 계정으로 실행되는 프로세스는 이러한 방식으로 권한 있는 계정으로 실행되는 다른 프로세스를 손상시킬 수 있다. 이것은 DLL에서 공유 섹션 사용을 피해야 하는 중요한 이유이다.

DLL이 특정 실행 파일 패커(예: UPX)로 압축된 경우 모든 코드 섹션이 읽기 및 쓰기로 표시되며 공유되지 않는다. 읽기 및 쓰기 코드 섹션은 개인 데이터 섹션과 마찬가지로 각 프로세스에 개인적이다. 따라서 공유 데이터 섹션이 있는 DLL은 여러 프로그램에서 동시에 사용하려는 경우 압축하면 안 된다. 각 프로그램 인스턴스가 자체 DLL 복사본을 가져야 하므로 메모리 소비가 증가하기 때문이다.

6. 3. DLL 하이재킹 (DLL Hijacking)

취약점의 일종인 DLL 하이재킹, DLL 스푸핑, DLL 프리로딩, 바이너리 심기 등으로 알려진 취약점은, 많은 프로그램들이 해당 프로그램이 열었던 데이터 파일과 같은 폴더에 포함된 악성 DLL을 로드하여 실행하게 한다.[13][14][15][16] 이 취약점은 2000년에 게오르기 구닌스키에 의해 발견되었다.[17]

2010년 8월, ACROS Security가 이 취약점을 재발견하고 수백 개의 프로그램이 취약한 것으로 드러나면서 전 세계적으로 널리 알려졌다.[18]

사용자가 쓸 수 있는 폴더, 즉 '다운로드' 또는 '임시' 디렉터리와 같이 안전하지 않은 위치에서 실행되는 프로그램은 거의 항상 이 취약점에 취약하다.[19][20][21][22][23][24][25]

7. COM (Component Object Model)

COM은 DLL 및 EXE 파일에서 객체의 구현을 호스팅하기 위한 바이너리 표준을 정의한다. COM은 해당 파일의 위치를 찾고 버전을 관리하는 메커니즘과 언어 독립적이고 기계가 읽을 수 있는 인터페이스 설명을 제공한다.[12] COM 객체를 DLL에 호스팅하면 더 가볍고 클라이언트 프로세스와 리소스를 공유할 수 있다. 이를 통해 COM 객체는 Visual Basic 및 ASP와 같은 간단한 GUI 프런트 엔드에 강력한 백엔드를 구현할 수 있으며, 스크립팅 언어로 프로그래밍할 수도 있다.[12]

참조

[1] 웹사이트 Creating a Resource-Only DLL https://msdn.microso[...] 2021-08-03
[2] 웹사이트 The End of DLL Hell https://msdn.microso[...] Microsoft Corporation 2009-07-11
[3] 웹사이트 Understanding the Import Address Table http://sandsprite.co[...] 2023-11-07
[4] 웹사이트 Building and Using DLLs https://cygwin.com/c[...]
[5] 웹사이트 ld and WIN32 https://sourceware.o[...]
[6] 웹사이트 Linker Support for Delay-Loaded DLLs https://msdn.microso[...] Microsoft Corporation 2009-07-11
[7] 웹사이트 Creating a Windows DLL with Visual Basic http://www.windowsde[...] O'Reilly Media 2009-07-11
[8] MSDN Using extern to Specify Linkage https://msdn.microso[...]
[9] 웹사이트 Dynamic-link library search order https://msdn.microso[...] 2023-02-09
[10] 웹사이트 A new CWDIllegalInDllSearch registry entry is available to control the DLL search path algorithm https://support.micr[...]
[11] 웹사이트 Secure loading of libraries to prevent DLL preloading attacks https://support.micr[...] 2019-10-28
[12] 웹사이트 Component Object Model (COM) https://msdn.microso[...] 2020-08-21
[13] 웹사이트 DLL Spoofing in Windows https://www.it.uu.se[...] 2023-11-07
[14] 웹사이트 DLL Preloading Attacks http://blogs.msdn.co[...] 2018-03-25
[15] 웹사이트 More information about the DLL Preloading remote attack vector http://blogs.technet[...] 2018-03-25
[16] 웹사이트 An update on the DLL-preloading remote attack vector http://blogs.technet[...] 2018-03-25
[17] 웹사이트 Double clicking on MS Office documents from Windows Explorer may execute arbitrary programs in some cases http://www.guninski.[...] 2018-03-25
[18] 웹사이트 Binary Planting - The Official Web Site of a Forgotten Vulnerability . ACROS Security http://www.binarypla[...] 2018-03-25
[19] 웹사이트 Carpet Bombing and Directory Poisoning https://insights.sei[...] 2023-11-07
[20] 웹사이트 Dev to Mozilla: Please dump ancient Windows install processes https://www.theregis[...] 2018-03-25
[21] 웹사이트 Gpg4win - Security Advisory Gpg4win 2015-11-25 https://www.gpg4win.[...] 2018-03-25
[22] 웹사이트 McAfee KB - McAfee Security Bulletin: Security patch for several McAfee installers and uninstallers (CVE-2015-8991, CVE-2015-8992, and CVE-2015-8993) (TS102462) https://service.mcaf[...] 2018-03-25
[23] 웹사이트 fsc-2015-4 - F-Secure Labs https://www.f-secure[...] 2018-03-25
[24] 웹사이트 ScanNow DLL Search Order Hijacking Vulnerability and Deprecation https://community.ra[...] 2018-03-25
[25] 웹사이트 oss-sec: CVE-2016-1281: TrueCrypt and VeraCrypt Windows installers allow arbitrary code execution with elevation of privilege http://seclists.org/[...] 2018-03-25
[26] 웹사이트 application/vnd.microsoft.portable-executable https://www.iana.org[...] IANA 2015-04-23
[27] MSDN DLL の利点 - MSDN https://msdn.microso[...]
[28] 간행물 INSIDE TOWNS TownsOS V2.1L20の機能 DLL活用術(前偏) Oh!FM TOWNS 1993-07
[29] 문서 「so」は「Shared Object」の略。



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com